package com.heima.user.service.impl;

import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.heima.model.common.dtos.ResponseResult;
import com.heima.model.common.enums.AppHttpCodeEnum;
import com.heima.model.user.dto.LoginDto;
import com.heima.model.user.pojos.ApUser;
import com.heima.user.mapper.ApUserMapper;
import com.heima.user.service.ApUserService;
import com.heima.utils.common.AppJwtUtil;
import io.jsonwebtoken.Claims;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;

import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

@Service
public class ApUserServiceImpl extends ServiceImpl<ApUserMapper, ApUser> implements ApUserService {
    /**
     * 用户登录
     *
     * @return
     */
    @Override
    public ResponseResult<ApUser> userLogin(LoginDto dto) {
//        Map<String, Object> map = new HashMap<>();
//
//
//        // 1、判断是否是 用户登录 还是登录看一看
//        if (StringUtils.isBlank(loginDto.getPassword()) && StringUtils.isBlank(loginDto.getPhone())){
//            // 2、看一看的话  就只给 token 不给 data数据
//            // 响应成功 生成 token
//            String token = AppJwtUtil.getToken(0l);
//            map.put("token",token);
//        }else {
//            // 3、用户通过 手机号跟密码登录    根据手机号 查询 用户
//            ApUser apUser = this.getOne(Wrappers.<ApUser>lambdaQuery().eq(ApUser::getPhone, loginDto.getPhone()));
//            // 4、判断 有没有 该用户
//            if (apUser == null){
//                // 不存在该用户
//                return ResponseResult.errorResult(AppHttpCodeEnum.AP_USER_DATA_NOT_EXIST);
//            }
//            // 5、把传过来的 明文进行加密
//            String password = loginDto.getPassword();
//            String md5DigestAsHex = DigestUtils.md5DigestAsHex((password + apUser.getSalt()).getBytes());
//            // 比较 密码是否一样
//            if (!apUser.getPassword().equals(md5DigestAsHex)){
//                // 不一样 密码错误
//                return ResponseResult.errorResult(AppHttpCodeEnum.LOGIN_PASSWORD_ERROR);
//            }
//            // 6、响应成功 生成 token
//            String token = AppJwtUtil.getToken(apUser.getId().longValue());
//
//            apUser.setPassword("");
//            apUser.setSalt("");
//            map.put("token",token);
//            map.put("user",apUser);
//        }
//
//   return ResponseResult.okResult(map);
//    }
        Map<String, Object> result = new HashMap<String, Object>();
        //1. 判断用户的账号密码是否为空
        if (StringUtils.isBlank(dto.getPhone()) || StringUtils.isBlank(dto.getPassword())) {
            //访客登录,给与0账号生成token
            //2.如果为空则证明是访客登录
            String token = AppJwtUtil.getToken(0L);
            result.put("token", token);
        } else {
            //3.如果不为空,则证明不是访客
            //4.根据phone查询数据库
            ApUser apUser = this.getOne(Wrappers.<ApUser>lambdaQuery().eq(ApUser::getPhone, dto.getPhone()));
            if (Objects.isNull(apUser)) {
                //5.判断查询结果是否为空  如果为空证明用户不存在,返回 用户不存在
                return ResponseResult.errorResult(AppHttpCodeEnum.AP_USER_DATA_NOT_EXIST);
            }
            if (apUser.getStatus()) {
                //账号被锁定
                return ResponseResult.errorResult(AppHttpCodeEnum.AP_USER_DATA_NOT_EXIST);
            }
            //如果不为空则证明账号存在,根据盐和当前输入的密码 加密后和数据库中查询到的密码比较 如果相同则登录成功,
            String pwd = dto.getPassword() + apUser.getSalt();
            String md5Pwd = DigestUtils.md5DigestAsHex(pwd.getBytes());
            if (!md5Pwd.equals(apUser.getPassword())) {
                //密码不相等 登录失败
                return ResponseResult.errorResult(AppHttpCodeEnum.LOGIN_PASSWORD_ERROR);
            }
            //密码也相等
            String token = AppJwtUtil.getToken(apUser.getId().longValue());
            result.put("token", token);
            apUser.setPassword("");
            apUser.setSalt("");
            result.put("user", apUser);
        }
        return ResponseResult.okResult(result);
    }
}
